import type {UserConfig, ConfigEnv} from 'vite';
import {loadEnv} from 'vite';
import {resolve} from 'path';
import {wrapperEnv} from './build/utils';
import {createVitePlugins} from './build/vite/plugin';
import {OUTPUT_DIR} from './build/constant';
import {createProxy} from './build/vite/proxy';
import pkg from './package.json';
import {format} from 'date-fns';

const {dependencies, devDependencies, name, version} = pkg;

const __APP_INFO__ = {
    pkg: {dependencies, devDependencies, name, version},
    lastBuildTime: format(new Date(), 'yyyy-MM-dd HH:mm:ss'),
};

function pathResolve(dir: string) {
    return resolve(process.cwd(), '.', dir);
}

export default ({command, mode}: ConfigEnv): UserConfig => {
    const root = process.cwd();
    const env = loadEnv(mode, root);
    const viteEnv = wrapperEnv(env);
    const {VITE_PUBLIC_PATH, VITE_DROP_CONSOLE, VITE_PORT, VITE_PROXY} = viteEnv;
    const isBuild = command === 'build';
    return {
        base: VITE_PUBLIC_PATH,
        plugins: createVitePlugins(viteEnv, isBuild),
        resolve: {
            alias: [
                {
                    find: /\/#\//,
                    replacement: pathResolve('types') + '/',
                },
                {
                    find: '@',
                    replacement: pathResolve('src') + '/',
                },
            ],
            dedupe: ['vue'],
        },
        define: {
            __APP_INFO__: JSON.stringify(__APP_INFO__)
        },
        css: {
            preprocessorOptions: {
                less: {
                    modifyVars: {},
                    javascriptEnabled: true,
                },
            },
        },
        server: {
            host: true,
            port: VITE_PORT,
            proxy: createProxy(VITE_PROXY)
        },
        optimizeDeps: {
            esbuildOptions:{
                define:{
                    global:'globalThis'
                },
                // plugins:[
                //     NodeGlobalsPolyfillPlugin({
                //         process:true,
                //         buffer:true
                //     }),
                //     NodeModulesPolyfillPlugin()
                // ]
            }
        },
        build: {
            target: 'es2015',
            outDir: OUTPUT_DIR,
            assetsDir: 'static/img/',
            terserOptions: {
                compress: {
                    keep_infinity: true,
                    drop_console: VITE_DROP_CONSOLE,
                },
            },
            brotliSize: false,
            chunkSizeWarningLimit: 2000,
            // rollupOptions:{
            //         plugins:[rollupNodePolyFill()]
            // }
        },
    };
};
